package com.heima.media.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.heima.common.dto.ResponseResult;
import com.heima.common.enums.AppHttpCodeEnum;
import com.heima.common.util.AppJwtUtil;
import com.heima.media.dto.LoginDto;
import com.heima.media.entity.WmUser;
import com.heima.media.mapper.WmUserMapper;
import com.heima.media.service.IWmUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import io.seata.spring.annotation.GlobalTransactional;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * 自媒体用户信息表 服务实现类
 * </p>
 *
 * @author ZC
 * @since 2022-06-27
 */
@Service
public class WmUserServiceImpl extends ServiceImpl<WmUserMapper, WmUser> implements IWmUserService {

    @Override
    public ResponseResult<WmUser> saveWmUser(WmUser wmUser) {
        LambdaQueryWrapper<WmUser> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(WmUser::getApUserId,wmUser.getApUserId());
        int count = this.count(queryWrapper);
        //计数   为0 则没有用户
        if (count==0){
            wmUser.setCreatedTime(new Date());
            this.save(wmUser);
        }
        return ResponseResult.okResult(wmUser);
    }

    @Override
    public ResponseResult login(LoginDto dto) {
            //判断是否缺少参数  StringUtils.isBlank(dto.getName())账号为空 /密码为空
            if (dto==null|| (StringUtils.isBlank(dto.getName())||(StringUtils.isBlank(dto.getPassword())))){
                //如果上述其中任何一项为空则 直接返回错误提示信息
                return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_REQUIRE);
            }
            //根据用户名查询用户   用户名不重复  有唯一索引
            LambdaQueryWrapper<WmUser> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(WmUser::getName,dto.getName());
            //获取唯一的用户名
             WmUser one = this.getOne(queryWrapper);
            if (one==null) {
                //如果这个用户名为null 则表示数据库中无此数据 返回对应的提示信息 -用户信息不存在
                return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
            }
            //在进行密码的比较   密码加密方式 MD5 - 结果是固定的  结果是不可逆的  可以在明文(可以看明白的密码)的基础上加盐(自己定义的字段)
            // =>加盐后的密码会变成 密文(看不懂的16进制的数据)
            String password = DigestUtils.md5Hex(dto.getPassword() + one.getSalt());
            // 获取到password 加上从数据库获取的盐 赋值给password
            if (!StringUtils.equals(one.getPassword(),password)) {
                //比较从数据库中获取到的密码和上面加盐的密码  =>取反 返回错误提示
                return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
            }
            //程序到此 证明密码验证成功  返回前端需要的数据(在页面F12可以看到)  =>装进一个map
            Map resultMap = new HashMap();
            //去除map中的敏感数据
            one.setPassword("");  //密码
            one.setSalt("");      //加的盐
            resultMap.put("user",one); //放入map

            //jwt 分成三个部分 第一部分是头 第二部分是需要传的参数(载荷) 第三部分是签名
            // 其中第 一和三 不可更改  二则是需要传递的参数  jwt.io
            Map<String,Object> claimMaps = new HashMap<>();
            claimMaps.put("userId",one.getId());
            claimMaps.put("name",one.getName());
            //把上面两个从数据库获取出来的的数据放入到Map中
            String token = AppJwtUtil.getToken(claimMaps);
            //传入map 生成token  载荷部分是上面传入map的数据
            resultMap.put("token",token);//放入map
            return ResponseResult.okResult(resultMap);
            //返回 resultMap
        }
    }

